package com.doraemon.controller.user;

import com.doraemon.constant.StatusConstant;
import com.doraemon.entity.Dish;
import com.doraemon.result.Result;
import com.doraemon.service.DishService;
import com.doraemon.vo.DishVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * c端菜品管理Controller
 **/
@RestController("userDishController") // 设置自定义 Bean 名称，防止同名冲突
@RequestMapping("/user/dish")
@Slf4j
@Api(tags = "菜品相关接口")
public class DishController {

    @Autowired
    private DishService dishService; // 注入菜品Service层
    @Autowired
    private RedisTemplate redisTemplate; // 注入redis操作工具类

    /***
     * 根据分类id查询菜品VO类
     * -由Spring Data Redis处理-
     * ---
     * @param categoryId 分类id
     * @return: com.doraemon.result.Result<com.doraemon.vo.DishVO>
     */
    @GetMapping("/list")
    @ApiOperation("根据分类id查询菜品")
    public Result<List<DishVO>> list(Long categoryId) {
        log.info("c端-根据分类id查询菜品：{}", categoryId);

        // 构造redis中的key 规则：dish_分类id
        String key = "dish_" + categoryId;

        // 查询redis中是否存在菜品数据
        List<DishVO> dishVOs = (List<DishVO>) redisTemplate.opsForValue().get(key); // 获取与dish_分类id对应的值（菜品VO集合）
        if (dishVOs != null && !dishVOs.isEmpty()) {
            return Result.success(dishVOs); // 如果存在直接返回数据，无需查询数据库
        }

        // 创建Dish实体，并赋值分类id和起售状态（只查询起售状态的菜品）
        Dish dish = new Dish();
        dish.setCategoryId(categoryId);
        dish.setStatus(StatusConstant.ENABLE);

        // 调用Service层 getVOListByDish 方法，获取起售状态菜品VO类集合
        dishVOs = dishService.getVOListByDish(dish);

        // 将菜品VO类集合放到redis中
        redisTemplate.opsForValue().set(key, dishVOs);

        return Result.success(dishVOs);
    }

}
